class Game{
    constructor(){
        var WebGL = laya.webgl.WebGL;
        Laya.init(480, 852, WebGL);//初始化舞台
        //游戏维护性强 
        //面向对象
        // 设置舞台宽高 和游戏引擎

        Laya.stage.scaleMode = "showall";//显示所有
        Laya.stage.alignH = "center";//舞台剧中
        Laya.stage.screenMode = "vertical";//显示模式 垂直

        //加载图集
        Laya.loader.load("res/atlas/war.atlas", Laya.Handler.create(this, this.onLoaded), null, Laya.Loader.ATLAS);
           Laya.loader.load("res/atlas/comp.atlas", Laya.Handler.create(this), null, Laya.Loader.ATLAS);
            // Laya.stage.txt();


    }
    onLoaded(){
        //游戏背景  
        //主角hero =>发子弹   
        //敌人
        //碰撞检测 （爆炸 掉血）
        var bg=new Bg();
        Laya.stage.addChild(bg);
     
      this.hero=new Role()
       this.hero.init('hero',0,5,0,30);
       this.hero.shootType=1;//可以发射子弹
       Laya.stage.addChild(this.hero)
       this.hero.pos(240,750)

        //敌人
        //监听舞台鼠标移动
        Laya.stage.on(Laya.Event.MOUSE_MOVE,this,function(e){
            this.hero.pos(Laya.stage.mouseX,Laya.stage.mouseY);//我方飞机
        })

        this.createEnemy(10);//敌机出现

Laya.timer.frameLoop(1, this, this.onLoop);//定时器 帧动画循环运动

//显示FPS
Laya.Stat.show();

    }
//主循环  帧
onLoop(){
//拿到所有敌机
//每隔60帧创建新敌机
    if(Laya.timer.currFrame%60===0){
        this.createEnemy(2);
    }

for(var i=Laya.stage.numChildren-1;i>-1;i--){
    var role=Laya.stage.getChildAt(i);
    if(role && role.speed){
        role.y+=role.speed;

             if(role.y>1000||!role.visible||(role.isBullet && role.y < -20)){
                role.removeSelf();//数量太多，删除多余
          }

    }

  //如果角色能发射子弹 ，处理发射子弹逻辑
            if (role.shootType == 1) {

                //获取当前时间
                var time = Laya.Browser.now();
                //如果当前时间大于下次射击时间
                if (time > role.shootTime) {
                    //更新下次射击时间
                    role.shootTime = time + role.shootInterval;
                    //创建一个子弹
                    var bullet = new Role();
                    //初始化子弹信息
                    //子弹的阵营和role一样
                    // type 角色类型    camp 阵营 hp血量  speed速度  hitRadius攻击半径
                    bullet.init("bullet1", role.camp, 1, -5, 1);
                    //设置角色类型为子弹类型
                    bullet.isBullet = true;
                    //设置子弹发射初始化位置
                    bullet.pos(role.x, role.y - role.hitRadius - 10);
                    //添加到舞台上
                    Laya.stage.addChild(bullet);
                    Laya.SoundManager.playSound("res/sound/bullet.mp3");

                }
            }
    }



 //
        //检测碰撞
        //倒着遍历，
        //足球拍手的 算法
        //足球队员 每两个人都要拍手一次 那种写法，不用都遍历
        //11个人，第一个人拍10个手， 第二个人再拍9个，第三个人再拍8个，这样循环就够了
        for (var i = Laya.stage.numChildren - 1; i > -1; i--) {
            //获取角色对象1
            var role1 = Laya.stage.getChildAt(i);
            //如果角色死亡则忽略
            if (role1.hp < 1) continue;
            // console.log('检测碰撞')
            for (var j = i - 1; j > -1; j--) {
                //如果角色死亡则忽略
                if (!role1.visible) continue;
                //console.log('检测碰撞')
                //获取角色对象2
                var role2 = Laya.stage.getChildAt(j);
                //如果角色未死亡，并且阵营不同，才行进碰撞
                // console.log('检测碰撞',role2.hp,role2.camp,role1.camp)
                if (role2.hp > 0 && role1.camp != role2.camp) {
                    //计算碰撞区域
                    var hitRadius = role1.hitRadius = role2.hitRadius;
                    //根据距离判断是否碰撞
                    if (Math.abs(role1.x - role2.x) < hitRadius && Math.abs(role1.y - role2.y) < hitRadius) {
                        // console.log('碰撞')
                        //碰撞后掉血
                        role2.lostHp(1);
                        role1.lostHp(1);
                    }
                }
            }

        }

// console.log(this)

        // 如果主角死亡，则停止游戏循环
        if (this.hero.hp < 1) {
            Laya.timer.clear(this, this.onLoop);
            //游戏结束声音
            Laya.SoundManager.playSound("res/sound/game_over.mp3");
           
        //    this.txt();

             var gameOver =  new GameOver()
            //将开始页面加载到舞台
            Laya.stage.addChild(gameOver);
           gameOver.restart.on(Laya.Event.MOUSE_UP,this,this.gameInit)
            


        }
}

 gameInit(){
        Laya.stage.offAll();//移除所有事件监听
        Laya.stage.removeChildren(0,Laya.stage.numChildren)//移除所有子元素
        this.onLoaded()
    }

//   txt(){
//             var txt=Laya.Text();
//                     txt.Text="游戏结束";
//                     txt.color = "#FF0000";
//                     //设置文本字体大小，单位是像素
//                     txt.fontSize = 66;  
//                     //设置字体描边
//                     txt.stroke = 5;//描边为5像素
//                     txt.strokeColor = "#FFFFFF";  
//                     //设置为粗体
//                     txt.bold = true;  
//                     //设置文本的显示起点位置X,Y
//                     txt.pos(60,100);  
//                     //设置舞台背景色
//                     Laya.stage.bgColor  = '#23238E';  
//                     //将文本内容添加到舞台 
//                     Laya.stage.addChild(txt);

//         }

 createEnemy(num) {
        //敌机血量表
        this.hps = [1, 2, 10];
        //敌机速度表
        this.speeds = [3, 2, 1];
        //敌机被击半径表
        this.radius = [15, 30, 70];

        for (var i = 0; i < num; i++) {
            //随机出现敌人
            var r = Math.random();

            //根据随机数，随机敌人   
            var type = r < 0.7 ? 0 : r < 0.95 ? 1 : 2;

            //创建敌人
            //初始化角色

            var enemy = new Role();
            //创建敌人，从对象池创建
            // var enemy = Laya.Pool.getItemByClass("role", Role);
            enemy.init("enemy" + (type + 1), 1, this.hps[type], this.speeds[type], this.radius[type])
            //随机位置
            enemy.pos(Math.random() * 400 + 40, Math.random() * 200);
            //添加到舞台上
            Laya.stage.addChild(enemy);

        }
    }



}

new Game()